#!/bin/bash

#******************************************************************************#
#                                                                              #
# MirarT                                                                       #
#                                                                              #
#******************************************************************************#

# Permite visualizar amigablemente el contenido de un archivo de log

#******************************************************************************#
#                                                                              #
# Funciones auxiliares                                                         #
#                                                                              #
#******************************************************************************#

uso()
{
	echo -e "Uso:

./MirarT [opciones] comando

Donde:

comando:
	Nombre del comando del cual se quiere visualizar el contenido de su log.
[opciones]:
	-n=k
		Filtrar los ultimos x mensajes grabados.
	-m=x
		Filtrar los mensajes que contienen la cadena de caracteres x.
	-f=x
		Filtrar los mensajes que fueron grabados en la fecha hora x.
	-u=x
		Filtrar los mensajes que fueron grabados por el usuario x.
	-t=x
		Filtrar los mensajes cuyo tipo es x.

Nota:
	* x forma parte del patrón de una expresion regular, no debe contener los meta-caracteres '^' o '$'.
	* Se puede aplicar mas de un filtro a la vez."
}

# uso: encolumnar contenido
encolumnar()
{
	echo -e "$1" | column -s'-' -t
}

#******************************************************************************#
#                                                                              #
# Main                                                                         #
#                                                                              #
#******************************************************************************#

#------------------------------------------------------------------------------#

# verifico que se hayan pasado los parametros obligatorios
if [ $# -lt 1 ]
then
	uso
	exit 1
fi

# determino las opciones que se eligieron y obtengo sus parametros
n=0
m=0
f=0
u=0
t=0
while getopts ":n:m:f:u:t:" opcion
do
	case $opcion in
		n)	n=1;;
		m)	m=1;;
		f)	f=1;;
		u)	u=1;;
		t)	t=1;;
    	\?)	echo "'$OPTARG' no es una opción válida."; exit 1;;
    	\:)	echo "Falta el parámetro de la opcion: '-$OPTARG'"; exit 1;;
	esac

	parametros[$opcion]="$OPTARG"

done

# verifico que el parametro de la opcion -n sea un valor numerico
if [ $n -eq 1 ]
then
	k=`echo "${parametros[n]}" | grep "^[0-9]\+$" -c`
	if [ ! $k -gt 0 ]
	then
		echo "El parametro de -n debe ser un valor numerico."
		exit 1
	fi
fi

# obtengo el nombre del comando del cual se quiere visualizar el contenido de su log
p=("$@")
comando="${p[$(( $OPTIND - 1))]}"
if [ -z $comando ]
then
	echo "Falta el nombre del comando."
	exit 1
fi

#------------------------------------------------------------------------------#

# determino el archivo de log

# determino el nombre del archivo de log
# determino la extension del archivo de log
if [ -z "$LOGEXT" ]
then
	extension=".log"
else
	extension="$LOGEXT"
fi
nombre_log="$comando$extension"

# determino el directorio donde se encuentra el archivo de log (10)
if [ -z "$LOGDIR" ]
then
	directorio_log="$GRUPO/logdir"
else
	directorio_log="$LOGDIR"
fi
log="$directorio_log/$nombre_log"

if [ ! -f $log ]
then
	echo "No existe el archivo: '$log'."
	exit 1
fi

#------------------------------------------------------------------------------#

# filtro el contenido del log segun las opciones que se eligieron

# si la opcion -n fue eligida es el 1er filtro que debo aplicar
if [ $n -eq 1 ]
then
	contenido=`tail --lines="${parametros[n]}" "$log"`
else
	contenido=`cat "$log"`
fi

if [ $m -eq 1 ]
then
	contenido=`echo "$contenido" | grep "^[^-]*-[^-]*-[^-]*-[^-]*-.*${parametros[m]}.*$"`
fi

if [ $f -eq 1 ]
then
	contenido=`echo "$contenido" | grep "^[^-]*${parametros[f]}[^-]*-[^-]*-[^-]*-[^-]*-[^-]*$"`
fi

if [ $u -eq 1 ]
then
	contenido=`echo "$contenido" | grep "^[^-]*-${parametros[u]}-[^-]*-[^-]*-[^-]*$"`
fi

if [ $t -eq 1 ]
then
	contenido=`echo "$contenido" | grep "^[^-]*-[^-]*-[^-]*-${parametros[t]}-[^-]*$"`
fi

#------------------------------------------------------------------------------#

# genero el reporte

h="Fecha-Usuario-Comando-T.-Mensaje\n" 	# titulos
s="=====-=======-=======-==-=======\n" 	# subrayado
H="$h$s"								# encabezado
F="\nT.: Tipo de mensaje."				# pie

if [ -z "$contenido" ]
then
	encolumnar "$H"
	echo "(no hay nada para mostrar)"
else
	encolumnar "$H$contenido"
fi
echo -e "$F"

#------------------------------------------------------------------------------#

exit 0
